Switch code to use gdk_display_is_composited() instead.
The new code also doesn't use a vfunc to query the property but rather
requires the backend to call set_composited()/set_rgba() to change the
value.
gdk_screen_get_default
gdk_screen_get_system_visual
gdk_screen_get_rgba_visual
-gdk_screen_is_composited
gdk_screen_get_root_window
gdk_screen_get_display
gdk_screen_get_number
_gdk_broadway_display_init_dnd (display);
- _gdk_broadway_screen_setup (broadway_display->screens[0]);
-
if (display_name == NULL)
display_name = g_getenv ("BROADWAY_DISPLAY");
return screen;
}
-/*
- * It is important that we first request the selection
- * notification, and then setup the initial state of
- * is_composited to avoid a race condition here.
- */
-void
-_gdk_broadway_screen_setup (GdkScreen *screen)
-{
-}
-
-static gboolean
-gdk_broadway_screen_is_composited (GdkScreen *screen)
-{
- return TRUE;
-}
-
-
static gboolean
gdk_broadway_screen_get_setting (GdkScreen *screen,
const gchar *name,
screen_class->get_display = gdk_broadway_screen_get_display;
screen_class->get_root_window = gdk_broadway_screen_get_root_window;
- screen_class->is_composited = gdk_broadway_screen_is_composited;
screen_class->get_setting = gdk_broadway_screen_get_setting;
screen_class->get_rgba_visual = gdk_broadway_screen_get_rgba_visual;
screen_class->get_system_visual = _gdk_broadway_screen_get_system_visual;
GType gdk_broadway_screen_get_type (void);
GdkScreen * _gdk_broadway_screen_new (GdkDisplay *display,
gint screen_number);
-void _gdk_broadway_screen_setup (GdkScreen *screen);
G_END_DECLS
{
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
- return gdk_screen_is_composited (gdk_display_get_default_screen (display));
+ return display->composited;
+}
+
+void
+gdk_display_set_composited (GdkDisplay *display,
+ gboolean composited)
+{
+ g_return_if_fail (GDK_IS_DISPLAY (display));
+
+ if (display->composited == composited)
+ return;
+
+ display->composited = composited;
+
+ g_object_notify_by_pspec (G_OBJECT (display), props[PROP_COMPOSITED]);
}
/**
{
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
- return gdk_screen_get_rgba_visual (gdk_display_get_default_screen (display)) != NULL;
+ return display->rgba;
+}
+
+void
+gdk_display_set_rgba (GdkDisplay *display,
+ gboolean rgba)
+{
+ g_return_if_fail (GDK_IS_DISPLAY (display));
+
+ if (display->rgba == rgba)
+ return;
+
+ display->rgba = rgba;
+
+ g_object_notify_by_pspec (G_OBJECT (display), props[PROP_RGBA]);
}
guint has_gl_extension_texture_non_power_of_two : 1;
guint has_gl_extension_texture_rectangle : 1;
+ guint rgba : 1;
+ guint composited : 1;
+
GdkRenderingMode rendering_mode;
GList *seats;
gboolean gdk_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context);
+void gdk_display_set_rgba (GdkDisplay *display,
+ gboolean rgba);
+void gdk_display_set_composited (GdkDisplay *display,
+ gboolean composited);
+
void gdk_display_add_seat (GdkDisplay *display,
GdkSeat *seat);
void gdk_display_remove_seat (GdkDisplay *display,
enum
{
SIZE_CHANGED,
- COMPOSITED_CHANGED,
MONITORS_CHANGED,
LAST_SIGNAL
};
G_PARAM_READWRITE|G_PARAM_STATIC_NAME|
G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
- /**
- * GdkScreen::composited-changed:
- * @screen: the object on which the signal is emitted
- *
- * The ::composited-changed signal is emitted when the composited
- * status of the screen changes
- *
- * Since: 2.10
- */
- signals[COMPOSITED_CHANGED] =
- g_signal_new (g_intern_static_string ("composited-changed"),
- G_OBJECT_CLASS_TYPE (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GdkScreenClass, composited_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-
/**
* GdkScreen::monitors-changed:
* @screen: the object on which the signal is emitted
return GDK_SCREEN_GET_CLASS (screen)->get_rgba_visual (screen);
}
-/**
- * gdk_screen_is_composited:
- * @screen: a #GdkScreen
- *
- * Returns whether windows with an RGBA visual can reasonably
- * be expected to have their alpha channel drawn correctly on
- * the screen.
- *
- * On X11 this function returns whether a compositing manager is
- * compositing @screen.
- *
- * Returns: Whether windows with RGBA visuals can reasonably be
- * expected to have their alpha channels drawn correctly on the screen.
- *
- * Since: 2.10
- **/
-gboolean
-gdk_screen_is_composited (GdkScreen *screen)
-{
- g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
-
- return GDK_SCREEN_GET_CLASS (screen)->is_composited (screen);
-}
-
/**
* gdk_screen_get_setting:
* @screen: the #GdkScreen where the setting is located
GdkVisual * gdk_screen_get_system_visual (GdkScreen *screen);
GDK_AVAILABLE_IN_ALL
GdkVisual * gdk_screen_get_rgba_visual (GdkScreen *screen);
-GDK_AVAILABLE_IN_ALL
-gboolean gdk_screen_is_composited (GdkScreen *screen);
GDK_AVAILABLE_IN_ALL
GdkWindow * gdk_screen_get_root_window (GdkScreen *screen);
GList * (* list_visuals) (GdkScreen *screen);
GdkVisual * (* get_system_visual) (GdkScreen *screen);
GdkVisual * (* get_rgba_visual) (GdkScreen *screen);
- gboolean (* is_composited) (GdkScreen *screen);
gboolean (* get_setting) (GdkScreen *screen,
const gchar *name,
GValue *value);
return GDK_MIR_SCREEN (screen)->visual;
}
-static gboolean
-gdk_mir_screen_is_composited (GdkScreen *screen)
-{
- //g_printerr ("gdk_mir_screen_is_composited\n");
- /* We're always composited */
- return TRUE;
-}
-
static gboolean
gdk_mir_screen_get_setting (GdkScreen *screen,
const gchar *name,
screen_class->list_visuals = gdk_mir_screen_list_visuals;
screen_class->get_system_visual = gdk_mir_screen_get_system_visual;
screen_class->get_rgba_visual = gdk_mir_screen_get_rgba_visual;
- screen_class->is_composited = gdk_mir_screen_is_composited;
screen_class->get_setting = gdk_mir_screen_get_setting;
screen_class->get_monitor_scale_factor = gdk_mir_screen_get_monitor_scale_factor;
}
return scale_factor;
}
-static gboolean
-gdk_quartz_screen_is_composited (GdkScreen *screen)
-{
- return TRUE;
-}
-
static void
gdk_quartz_screen_class_init (GdkQuartzScreenClass *klass)
{
screen_class->get_monitor_plug_name = gdk_quartz_screen_get_monitor_plug_name;
screen_class->get_monitor_geometry = gdk_quartz_screen_get_monitor_geometry;
screen_class->get_monitor_workarea = gdk_quartz_screen_get_monitor_workarea;
- screen_class->is_composited = gdk_quartz_screen_is_composited;
screen_class->get_setting = _gdk_quartz_screen_get_setting;
screen_class->get_rgba_visual = _gdk_quartz_screen_get_rgba_visual;
screen_class->get_system_visual = _gdk_quartz_screen_get_system_visual;
return (GdkVisual *) GDK_WAYLAND_SCREEN (screen)->visual;
}
-static gboolean
-gdk_wayland_screen_is_composited (GdkScreen *screen)
-{
- return TRUE;
-}
-
static void
notify_setting (GdkScreen *screen,
const gchar *setting)
screen_class->get_root_window = gdk_wayland_screen_get_root_window;
screen_class->get_system_visual = gdk_wayland_screen_get_system_visual;
screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
- screen_class->is_composited = gdk_wayland_screen_is_composited;
screen_class->get_setting = gdk_wayland_screen_get_setting;
screen_class->list_visuals = gdk_wayland_screen_list_visuals;
}
{
display->monitors = g_ptr_array_new_with_free_func (g_object_unref);
_gdk_win32_display_init_cursors (display);
+ gdk_win32_display_check_composited (display);
+}
+
+void
+gdk_win32_display_check_composited (GdkWin32Display *display)
+{
+ gboolean composited;
+
+ /* On Windows 8 and later, DWM (composition) is always enabled */
+ if (g_win32_check_windows_version (6, 2, 0, G_WIN32_OS_ANY))
+ {
+ composited = TRUE;
+ }
+ else
+ {
+ if (DwmIsCompositionEnabled (&composited) != S_OK)
+ composited = FALSE;
+ }
+
+ gdk_display_set_composited (GDK_DISPLAY (display), composited);
}
static void
GPtrArray *_gdk_win32_display_get_monitor_list (GdkWin32Display *display);
+void gdk_win32_display_check_composited (GdkWin32Display *display);
+
#endif /* __GDK_DISPLAY__WIN32_H__ */
break;
case WM_DWMCOMPOSITIONCHANGED:
+ gdk_win32_display_check_composited (GDK_WIN32_DISPLAY (display));
_gdk_win32_window_enable_transparency (window);
break;
GdkVisualType available_visual_types[1];
GdkWindow *root_window;
-
- gint always_composited : 1;
};
struct _GdkWin32ScreenClass
_gdk_win32_display_init_monitors (GDK_WIN32_DISPLAY (_gdk_display));
init_root_window (win32_screen);
-
- /* On Windows 8 and later, DWM (composition) is always enabled */
- win32_screen->always_composited = g_win32_check_windows_version (6, 2, 0, G_WIN32_OS_ANY);
}
void
return GDK_WIN32_SCREEN (screen)->root_window;
}
-static gboolean
-gdk_win32_screen_is_composited (GdkScreen *screen)
-{
- if (GDK_WIN32_SCREEN (screen)->always_composited)
- return TRUE;
- else
- {
- gboolean is_composited;
-
- if (DwmIsCompositionEnabled (&is_composited) != S_OK)
- return FALSE;
- return is_composited;
- }
-}
-
static GdkVisual *
gdk_win32_screen_get_system_visual (GdkScreen *screen)
{
screen_class->get_display = gdk_win32_screen_get_display;
screen_class->get_root_window = gdk_win32_screen_get_root_window;
- screen_class->is_composited = gdk_win32_screen_is_composited;
screen_class->get_setting = _gdk_win32_screen_get_setting;
screen_class->get_system_visual = gdk_win32_screen_get_system_visual;
screen_class->get_rgba_visual = gdk_win32_screen_get_rgba_visual;
screen = gdk_window_get_screen (window);
- if (!gdk_screen_is_composited (screen))
+ if (!gdk_display_is_composited (gdk_window_get_display (window)))
return FALSE;
if (window == gdk_screen_get_root_window (screen))
*/
if (impl->layered)
{
- if (gdk_screen_is_composited (gdk_window_get_screen (window)))
+ if (gdk_display_is_composited (gdk_window_get_display (window)))
{
hdc = NULL;
window_size_ptr = NULL;
G_IMPLEMENT_INTERFACE (GDK_TYPE_EVENT_TRANSLATOR,
gdk_x11_display_event_translator_init))
-
static void
gdk_x11_display_init (GdkX11Display *display)
{
do_net_wm_state_changes (window);
}
+static Atom
+get_cm_atom (GdkDisplay *display)
+{
+ return _gdk_x11_get_xatom_for_display_printf (display, "_NET_WM_CM_S%d", DefaultScreen (GDK_DISPLAY_XDISPLAY (display)));
+}
+
static Window
get_event_xwindow (XEvent *xevent)
{
{
XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)xevent;
- _gdk_x11_screen_process_owner_change (screen, xevent);
-
+ if (selection_notify->selection == get_cm_atom (display))
+ {
+ gboolean composited = selection_notify->owner != None;
+
+ gdk_display_set_composited (display, composited);
+ }
+
event->owner_change.type = GDK_OWNER_CHANGE;
event->owner_change.window = window;
if (selection_notify->owner != None)
/* initialize the display's screens */
display_x11->screen = _gdk_x11_screen_new (display, DefaultScreen (display_x11->xdisplay));
+ if (gdk_screen_get_rgba_visual (display_x11->screen) == NULL)
+ gdk_display_set_rgba (display, FALSE);
/* We need to initialize events after we have the screen
* structures in places
}
#endif
- _gdk_x11_screen_setup (display_x11->screen);
+ /*
+ * It is important that we first request the selection
+ * notification, and then setup the initial state of
+ * is_composited to avoid a race condition here.
+ */
+ gdk_display_request_selection_notification (display,
+ gdk_x11_xatom_to_atom_for_display (display, get_cm_atom (display)));
+ gdk_display_set_composited (GDK_DISPLAY (display),
+ XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), get_cm_atom (display)) != None);
g_signal_emit_by_name (display, "opened");
* the COW. We assume that the CM is using the COW (which is true for pretty
* much any CM currently in use).
*/
- if (gdk_screen_is_composited (screen))
+ if (gdk_display_is_composited (gdk_screen_get_display (screen)))
{
cow = XCompositeGetOverlayWindow (xdisplay, GDK_WINDOW_XID (root_window));
gdk_window_cache_add (result, cow, 0, 0,
{
GdkX11GLContext *context_x11;
Display *dpy = gdk_x11_display_get_xdisplay (display);
- GdkWindow *window;
- GdkScreen *screen;
gboolean do_frame_sync = FALSE;
if (context == NULL)
if (context_x11->is_attached && GDK_X11_DISPLAY (display)->has_glx_swap_interval)
{
- window = gdk_gl_context_get_window (context);
-
/* If the WM is compositing there is no particular need to delay
* the swap when drawing on the offscreen, rendering to the screen
* happens later anyway, and its up to the compositor to sync that
* to the vblank. */
- screen = gdk_window_get_screen (window);
- do_frame_sync = ! gdk_screen_is_composited (screen);
+ do_frame_sync = ! gdk_display_is_composited (display);
if (do_frame_sync != context_x11->do_frame_sync)
{
return GDK_X11_SCREEN (screen)->screen_num;
}
-static Atom
-get_cm_atom (GdkX11Screen *x11_screen)
-{
- return _gdk_x11_get_xatom_for_display_printf (x11_screen->display, "_NET_WM_CM_S%d", x11_screen->screen_num);
-}
-
-static gboolean
-check_is_composited (GdkDisplay *display,
- GdkX11Screen *x11_screen)
-{
- Window xwindow;
-
- xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), get_cm_atom (x11_screen));
-
- return xwindow != None;
-}
-
static GdkX11Monitor *
find_monitor_by_output (GdkX11Display *x11_display, XID output)
{
g_signal_emit_by_name (GDK_SCREEN (x11_screen), "monitors-changed");
}
-/*
- * It is important that we first request the selection
- * notification, and then setup the initial state of
- * is_composited to avoid a race condition here.
- */
-void
-_gdk_x11_screen_setup (GdkScreen *screen)
-{
- GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
-
- gdk_display_request_selection_notification (x11_screen->display,
- gdk_x11_xatom_to_atom_for_display (x11_screen->display, get_cm_atom (x11_screen)));
- x11_screen->is_composited = check_is_composited (x11_screen->display, x11_screen);
-}
-
-static gboolean
-gdk_x11_screen_is_composited (GdkScreen *screen)
-{
- GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
-
- return x11_screen->is_composited;
-}
-
static void
init_randr_support (GdkScreen *screen)
{
g_signal_emit (screen, signals[WINDOW_MANAGER_CHANGED], 0);
}
-void
-_gdk_x11_screen_process_owner_change (GdkScreen *screen,
- XEvent *event)
-{
-#ifdef HAVE_XFIXES
- XFixesSelectionNotifyEvent *selection_event = (XFixesSelectionNotifyEvent *)event;
- GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
-
- if (selection_event->selection == get_cm_atom (x11_screen))
- {
- gboolean composited = selection_event->owner != None;
-
- if (composited != x11_screen->is_composited)
- {
- x11_screen->is_composited = composited;
-
- g_signal_emit_by_name (screen, "composited-changed");
- }
- }
-#endif
-}
-
static gboolean
gdk_x11_screen_get_setting (GdkScreen *screen,
const gchar *name,
screen_class->get_root_window = gdk_x11_screen_get_root_window;
screen_class->get_system_visual = _gdk_x11_screen_get_system_visual;
screen_class->get_rgba_visual = gdk_x11_screen_get_rgba_visual;
- screen_class->is_composited = gdk_x11_screen_is_composited;
screen_class->get_setting = gdk_x11_screen_get_setting;
screen_class->list_visuals = _gdk_x11_screen_list_visuals;
* fetch of window manager name
*/
guint need_refetch_wm_name : 1;
- guint is_composited : 1;
guint xft_init : 1; /* Whether we've intialized these values yet */
guint xft_antialias : 1;
guint xft_hinting : 1;
GdkScreen * _gdk_x11_screen_new (GdkDisplay *display,
gint screen_number);
-void _gdk_x11_screen_setup (GdkScreen *screen);
void _gdk_x11_screen_update_visuals_for_gl (GdkScreen *screen);
void _gdk_x11_screen_window_manager_changed (GdkScreen *screen);
void _gdk_x11_screen_size_changed (GdkScreen *screen,
XEvent *event);
-void _gdk_x11_screen_process_owner_change (GdkScreen *screen,
- XEvent *event);
void _gdk_x11_screen_get_edge_monitors (GdkScreen *screen,
gint *top,
gint *bottom,
if (!info->icon_window)
{
+ GdkDisplay *display;
GdkScreen *screen;
screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context));
+ display = gdk_window_get_display (gdk_drag_context_get_source_window (context));
info->icon_window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_type_hint (GTK_WINDOW (info->icon_window), GDK_WINDOW_TYPE_HINT_DND);
gtk_widget_set_size_request (info->icon_window, 24, 24);
gtk_widget_set_events (info->icon_window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
- if (gdk_screen_is_composited (screen))
+ if (gdk_display_is_composited (display))
gtk_widget_set_app_paintable (info->icon_window, TRUE);
gtk_window_set_hardcoded_window (GTK_WINDOW (info->icon_window),
cairo_surface_t *surface)
{
GtkWidget *window;
+ GdkDisplay *display;
GdkScreen *screen;
GdkRectangle extents;
cairo_pattern_t *pattern;
_gtk_cairo_surface_extents (surface, &extents);
+ display = gdk_window_get_display (gdk_drag_context_get_source_window (context));
screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context));
window = gtk_window_new (GTK_WINDOW_POPUP);
g_signal_connect_data (window,
"draw",
- gdk_screen_is_composited (screen) ? G_CALLBACK (gtk_drag_draw_icon_pattern)
- : G_CALLBACK (gtk_drag_draw_icon_pattern_and_background),
+ gdk_display_is_composited (display) ? G_CALLBACK (gtk_drag_draw_icon_pattern)
+ : G_CALLBACK (gtk_drag_draw_icon_pattern_and_background),
pattern,
(GClosureNotify) cairo_pattern_destroy,
G_CONNECT_AFTER);
*
* Whether @widget can rely on having its alpha channel
* drawn correctly. On X11 this function returns whether a
- * compositing manager is running for @widget’s screen.
+ * compositing manager is running for @widget’s display.
*
* Returns: %TRUE if the widget can rely on its alpha
* channel being drawn correctly.
gboolean
gtk_widget_is_composited (GtkWidget *widget)
{
- GdkScreen *screen;
+ GdkDisplay *display;
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
- screen = gtk_widget_get_screen (widget);
+ display = gtk_widget_get_display (widget);
- return gdk_screen_is_composited (screen);
+ return gdk_display_is_composited (display);
}
/**
{
GdkDisplay *display;
GdkScreen *screen;
- GdkVisual *visual;
screen = _gtk_window_get_screen (window);
display = gdk_screen_get_display (screen);
+ if (!gdk_display_is_rgba (display))
+ return FALSE;
+
+ if (!gdk_display_is_composited (display))
+ return FALSE;
+
#ifdef GDK_WINDOWING_X11
if (GDK_IS_X11_DISPLAY (display))
{
- if (!gdk_screen_is_composited (screen))
- return FALSE;
-
if (!gdk_x11_screen_supports_net_wm_hint (screen, gdk_atom_intern_static_string ("_GTK_FRAME_EXTENTS")))
return FALSE;
-
- /* We need a visual with alpha */
- visual = gdk_screen_get_rgba_visual (screen);
- if (!visual)
- return FALSE;
- }
-#endif
-
-#ifdef GDK_WINDOWING_WIN32
- if (GDK_IS_WIN32_DISPLAY (display))
- {
- if (!gdk_screen_is_composited (screen))
- return FALSE;
-
- /* We need a visual with alpha */
- visual = gdk_screen_get_rgba_visual (screen);
- if (!visual)
- return FALSE;
}
#endif
screen = gdk_screen_get_default ();
g_signal_connect (display, "notify", G_CALLBACK (populate_display_notify_cb), gen);
- g_signal_connect (screen, "composited-changed", G_CALLBACK (populate_display), gen);
g_signal_connect (screen, "monitors-changed", G_CALLBACK (populate_display), gen);
populate_display (screen, gen);
static void
deemphasize_window (GtkWidget *window)
{
- GdkScreen *screen;
+ GdkDisplay *display;
- screen = gtk_widget_get_screen (window);
- if (gdk_screen_is_composited (screen))
+ display = gtk_widget_get_display (window);
+ if (gdk_display_is_composited (display))
{
cairo_rectangle_int_t rect;
cairo_region_t *region;
static void
reemphasize_window (GtkWidget *window)
{
- GdkScreen *screen;
+ GdkDisplay *display;
- screen = gtk_widget_get_screen (window);
- if (gdk_screen_is_composited (screen))
+ display = gtk_widget_get_display (window);
+ if (gdk_display_is_composited (display))
{
gtk_widget_set_opacity (window, 1.0);
gtk_widget_input_shape_combine_region (window, NULL);
}
static void
-on_composited_changed (GdkScreen *screen,
- GtkLabel *label)
+on_composited_changed (GdkDisplay *display,
+ GParamSpec *pspec,
+ GtkLabel *label)
{
- gboolean is_composited = gdk_screen_is_composited (screen);
+ gboolean is_composited = gdk_display_is_composited (display);
if (is_composited)
gtk_label_set_text (label, "Composited");
else
gtk_label_set_text (label, "Not composited");
+
+ /* We draw a different background on the GdkWindow */
+ gtk_widget_queue_draw (gtk_widget_get_toplevel (GTK_WIDGET (label)));
}
void
GtkWidget *content_area;
GtkWidget *vbox;
GtkWidget *label;
- GdkScreen *screen;
+ GdkDisplay *display;
window = gtk_dialog_new_with_buttons ("Alpha Window",
GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
label = gtk_label_new (NULL);
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE);
- screen = gtk_widget_get_screen (window);
- on_composited_changed (screen, GTK_LABEL (label));
- g_signal_connect (screen, "composited_changed", G_CALLBACK (on_composited_changed), label);
+ display = gtk_widget_get_display (window);
+ on_composited_changed (display, NULL, GTK_LABEL (label));
+ g_signal_connect (display, "notify::composited", G_CALLBACK (on_composited_changed), label);
gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE);